// #include"UdpServer.hpp"
// #include<memory>
// #include<vector>
// #include"Log.hpp"


// void Usage(string proc)
// {
//     cout << "Usage: " << proc << " proc[1024+]\n" << endl;
// }

// string Handler(const string& str)
// {
//     string res = "server get a message";
//     res += str;

//     pid_t id = fork();
//     if (id == 0)
//     {
        
//     }
//     else if (id > 0)
//     {

//     }

//     cout << res << endl;
//     return res;    
// }

// bool SafeCheck(const string& cmd)
// {
//     vector<string>  key_word =
//     {
//         "rm",
//         "mv",
//         "mk",
//         "unlink",
//         "uninstall",
//         "yum",
//         "cp",
//         "kill"
//     };

//     for (auto& e : key_word)
//     {
//         auto pos = cmd.find(e);
//         if (pos != string::npos) return false;

//     }
//     return true;
// }

// string ExcuteCommand(string& cmd)
// {
//     FILE* fp = popen(cmd.c_str(), "r");
//     if (fp == nullptr) 
//     {
//         perror("popen");
//         return "error";
//     }
//     //
    
//     string res;
//     char buffer[4096];
//     while (true)
//     {
//         char* ret = fgets(buffer, sizeof(buffer), fp);
//         if (ret == nullptr) break;
//         res += buffer;
//     }


//     pclose(fp);

// }
 
// int main(int argc, char* argv[])
// {
//     // if (argc != 3)
//     // {
//     //     Usage(argv[0]);
//     //     exit(0);
//     // }
//     //
//     // string ip = argv[1];
//     // uint16_t port = stoi(argv[2]);

//     unique_ptr<UdpServer> svr(new UdpServer());

//     svr->init();
//     svr->run(Handler);

//     return 0;
// }

#include"UdpServer.hpp"
#include<memory>

string Handler(string message, sockaddr_in& client, unordered_map<string, sockaddr_in>& clients)
{
    string tmp = inet_ntoa(client.sin_addr) + to_string(client.sin_port);
    if (!clients.count(tmp))
    {
        clients[tmp] = client; 
        cout << "ip " << inet_ntoa(client.sin_addr) << " : port " << client.sin_port << " has add in talk room" << endl;
    }
    message = "[" + string(inet_ntoa(client.sin_addr)) + ":" + to_string(client.sin_port) + "]#: " + message; 
    return message;
}

// 

int main(int argc, char* argv[])
{
    if (argc != 2)
    {
        cout << "has return" << endl;
        return 1;
    }
    //
    uint16_t serverport = stoi(argv[1]);  

    unique_ptr<UdpServer> svr(new UdpServer(serverport));
    //
    svr->Init();
    svr->run(Handler);


    return 0;
}